/*
 * 
 *  Este arquivo é parte do software TODO Calculadora. TODO Calculadora é um software livre;
 *  você pode redistribui-lo e/ou modifica-lo dentro dos termos da Licença Pública Geral GNU
 *  como publicada pela Fundação do Software Livre (FSF); na versão 2 da Licença,
 *  ou (na sua opnião) qualquer versão.
 *  
 *	Este programa é distribuido na esperança que possa ser útil, mas SEM NENHUMA GARANTIA;
 *  sem uma garantia implícita de ADEQUAÇÂO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR.
 *  Veja a Licença Pública Geral GNU para maiores detalhes. Você deve ter recebido uma cópia
 *  da Licença Pública Geral GNU junto com este programa, se não, escreva para a Fundação do
 *	Software Livre(FSF)
 *
 *	Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

package util.gui;

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.text.JTextComponent;

/**
 * <p>
 * Classe utilitária que realiza aos tratamentos básicos na tela de interface
 * gráfica.
 * </p>
 * 
 * 
 * @author Willyan Guimarães Caetano
 */
public final class CalculadorGUIUtil {

	/** Constante que representa número "1" (um) */
	public static final String UM = "1";

	/** Constante que representa número "2" (dois) */
	public static final String DOIS = "2";

	/** Constante que representa número "3" (três) */
	public static final String TRES = "3";

	/** Constante que representa número "4" (quatro) */
	public static final String QUATRO = "4";

	/** Constante que representa número "5" (cinco) */
	public static final String CINCO = "5";

	/** Constante que representa número "6" (seis) */
	public static final String SEIS = "6";

	/** Constante que representa número "7" (sete) */
	public static final String SETE = "7";

	/** Constante que representa número "8" (oito) */
	public static final String OITO = "8";

	/** Constante que representa número "9" (nove) */
	public static final String NOVE = "9";

	/** Constante que representa número "0" (zero) */
	public static final String ZERO = "0";

	/** Constante que representa o caractere de vírgula (",") */
	public static final String VIRGULA = ",";

	/**
	 * Constante que o tamanho máximo do campo numérico da calculadora, que é
	 * "12" (doze)
	 */
	public static final int tamanhoMaximoCampo = 12;

	private CalculadorGUIUtil() {
	}

	/**
	 * <p>
	 * Verifica se já existe algum dado digitado na calculadora. Deve ser
	 * executado sempre que um novo dígito é reconhecido visto que o número
	 * poderá estar sendo composto para o processo de operação e então deve ser
	 * usado no processo de concatenação.
	 * </p>
	 * 
	 * @param campo
	 *            Campo de texto
	 */
	public static boolean verificaExistenciaDadosCampo(JTextComponent campo) {
		return campo.getText().length() != 0;
	}

	/**
	 * 
	 * @param campo
	 *            Valor capturado no campo da calculadora
	 * @return Valor do campo
	 */
	public static String capturaValorDoCampo(JTextComponent campo) {
		String valor = campo.getText();

		return valor;
	}

	/**
	 * <p>
	 * Faz o trabalho de concatenação dos números para composição do valor
	 * digitado na calculadora.
	 * </p>
	 * 
	 * @param caracter
	 *            Caracter digitado
	 * @param campo
	 *            Display da calculadora
	 * @return Valor atualizado
	 */
	public static String posicionaCaracteresCampo(String caracter,
			JTextComponent campo) {
		String valorAtualNoCampo = capturaValorDoCampo(campo);

		String valorAtualizado = valorAtualNoCampo + caracter;

		return valorAtualizado;
	}

	/**
	 * Processa inserção de valores no campo numérico verificando a existência
	 * de algum dado no mesmo e chamando o processo de posicionamento.
	 * 
	 * @param caracter
	 *            Caracter novo
	 * @param campo
	 *            Campo numérico
	 * @return
	 */
	public static String processaInsercaoValorCampo(String caracter,
			JTextComponent campo) {
		if (verificaExistenciaDadosCampo(campo)) {
			String novoValor = posicionaCaracteresCampo(caracter, campo);

			return novoValor;
		} else {
			return caracter;

		}
	}

	/**
	 * Executa a limpeza no campo numérico da calculadora e também retorna o
	 * foco para a mesma.
	 */
	public static void executaLimpezaCampoERetornoDeFoco(JTextComponent campo) {
		campo.setText("");
		campo.grabFocus();
	}

	/**
	 * Processa a lógica da tecla de inversão de sinais
	 * 
	 * @param campo
	 *            Campo de onde é capturada os sinais
	 * @return
	 */
	public static String processaTeclaInversaoSinais(JTextComponent campo) {
		if (campo.getText().equals("")) {
			return "";
		} else if (campo.getText().startsWith("-")) {
			return campo.getText().replace("-", "");
		} else {
			return "-" + campo.getText();
		}

	}

	/**
	 * <p>
	 * Verifica tecla que foi pressionada e caso seja um número, retorna para o
	 * display
	 * </p>
	 * 
	 * @param evt
	 *            Evento de tecla correspondente a tecla digitada
	 * @return Valor a ser exibido no display
	 */
	public static String verificaTeclaPressionada(ActionEvent evt) {

		if (evt.getSource().equals(KeyEvent.VK_0)) {
			return ZERO;
		} else if (evt.getSource().equals(KeyEvent.VK_1)) {
			return UM;
		} else if (evt.getSource().equals(KeyEvent.VK_2)) {
			return DOIS;
		} else if (evt.getSource().equals(KeyEvent.VK_3)) {
			return TRES;
		} else if (evt.getSource().equals(KeyEvent.VK_4)) {
			return QUATRO;
		} else if (evt.getSource().equals(KeyEvent.VK_5)) {
			return CINCO;
		} else if (evt.getSource().equals(KeyEvent.VK_6)) {
			return SEIS;
		} else if (evt.getSource().equals(KeyEvent.VK_7)) {
			return SETE;
		} else if (evt.getSource().equals(KeyEvent.VK_8)) {
			return OITO;
		} else if (evt.getSource().equals(KeyEvent.VK_9)) {
			return NOVE;
		} else if (evt.getSource().equals(KeyEvent.VK_COMMA)) {
			return VIRGULA;
		} else {
			return null;
		}
	}

}
